import { Hero } from './Hero';
import { Enemy } from './Enemy';
import { EnemyFactory } from '../factories/EnemyFactory';

export class Game {
  private turns: number = 0;
  private currentStage: number = 1;
  private bossesDefeated: number = 0;

  constructor(
    private hero: Hero,
    private enemyFactory: EnemyFactory
  ) {}

  // 开始游戏
  start(): void {
    console.log(`\n🚩 冒险开始！第 ${this.currentStage} 层`);
    
    // 游戏主循环
    while (this.hero.isAlive()) {
      this.turns++;
      
      // 每5回合可能出现BOSS
      const isBossFight = this.turns % 5 === 0 && this.turns > 0;
      
      // 创建敌人
      const enemy = isBossFight 
        ? this.enemyFactory.createBoss(this.currentStage)
        : this.enemyFactory.createRandomEnemy(this.currentStage);
      
      console.log(`\n=== 回合 ${this.turns} ${isBossFight ? '👑 BOSS战 👑' : ''} ===`);
      console.log(`遭遇了 ${enemy.name}!`);
      enemy.displayStatus();
      
      // 战斗
      this.battle(enemy);
      
      // 检查是否通关
      if (isBossFight && !enemy.isAlive()) {
        this.bossesDefeated++;
        console.log(`\n✅ 击败了 BOSS！进入第 ${++this.currentStage} 层`);
        
        // 每击败一个BOSS，勇者恢复一些生命值
        this.hero.restoreHealth(30);
        
        // 如果击败了3个BOSS，游戏胜利
        if (this.bossesDefeated >= 3) {
          this.victory();
          break;
        }
      }
    }
    
    // 检查游戏结束条件
    if (!this.hero.isAlive()) {
      this.gameOver();
    }
  }

  // 战斗逻辑
  private battle(enemy: Enemy): void {
    while (this.hero.isAlive() && enemy.isAlive()) {
      // 勇者回合
      this.hero.attackEnemy(enemy);
      
      // 检查敌人是否被击败
      if (!enemy.isAlive()) {
        console.log(`\n🏆 ${enemy.name} 被击败了！`);
        this.hero.gainExperience(enemy.experienceReward);
        
        // 有几率掉落药水
        if (Math.random() < 0.3) {
          console.log(`🎁 发现了治疗药水！`);
          this.hero.restoreHealth(20);
        }
        break;
      }
      
      // 敌人回合
      enemy.attackHero(this.hero);
      
      // 检查勇者是否被击败
      if (!this.hero.isAlive()) {
        console.log(`\n💀 ${this.hero.name} 被击败了！`);
        break;
      }
    }
  }

  // 游戏胜利
  private victory(): void {
    console.log(`\n🎉🎉🎉 恭喜！${this.hero.name} 成功击败了所有BOSS！`);
    console.log(`\n=== 游戏统计 ===`);
    console.log(`最终等级: ${this.hero.level}`);
    console.log(`战斗回合: ${this.turns}`);
    console.log(`击败敌人: ${this.turns}`);
    console.log(`获得经验: ${this.hero.experience}`);
  }

  // 游戏结束
  private gameOver(): void {
    console.log(`\n💀 游戏结束 💀`);
    console.log(`\n=== 游戏统计 ===`);
    console.log(`到达等级: ${this.hero.level}`);
    console.log(`生存回合: ${this.turns}`);
    console.log(`击败敌人: ${this.turns - 1}`);
    console.log(`获得经验: ${this.hero.experience}`);
    console.log(`\n再接再厉，勇者！`);
  }
}